package frsf.cidisi.exercise.tp1.search;

import javax.swing.SwingWorker;

import frsf.cidisi.faia.simulator.Log;
import frsf.cidisi.exercise.tp1.interfaz.ControlSimulacion;
import frsf.cidisi.exercise.tp1.utiles.DatosAmbiente;
import frsf.cidisi.faia.agent.Action;
import frsf.cidisi.faia.agent.Perception;
import frsf.cidisi.faia.environment.Environment;

public class IslaEmiroce extends Environment {

	private DatosAmbiente datosAmbiente = new DatosAmbiente();
	private Log log = new Log();
	private boolean pirata;
	private ControlSimulacion controlSimulacion;
	
	
    public IslaEmiroce() {
        
        this.environmentState = new EstadoActualIsla();
    }

    
    public EstadoActualIsla getEnvironmentState() {
    
    	return (EstadoActualIsla) super.getEnvironmentState();
    	
    }

    /**
     * This method is called by the simulator. Given the Agent, it creates
     * a new perception reading, for example, the agent position.
     * @param agent
     * @return A perception that will be given to the agent by the simulator.
     */
    @Override
    public  ArqueologoPerception getPercept() {
    	
    	
    	actualizarConsolaInterfaz();
    	
    	//Actua Ubeme
    	if(pirata){
    	accionUbeme();
    	}
        // Crea una nueva percepcion para retornar
         ArqueologoPerception perception = new ArqueologoPerception();
		
		// Set de todos los sensores del agente
         //TODO: Modificacion de posicion en vector de tesoros
         perception.settesoroactual(this.getEnvironmentState().getTesoros()[this.getEnvironmentState().getPosicionAgente()-1]);
         perception.setdistribuciondetesoros(this.getEnvironmentState().getTesoros());
        
        // Retorna la percepcion
        return perception;
    }

    public void actualizarConsolaInterfaz(){
    	
    
    	new SwingWorker<Object, Object>(){

			@Override
			protected Object doInBackground() throws Exception {
			
				getControlSimulacion().actualizarConsolaEnInterfaz();
			
				return null;
			}
		
		}.execute();
		
    	
    	
    }
    
    private void accionUbeme(){
    	
    	//Modificar o no el ambiente.
    	int posicionPirata = (int)(Math.random()*10)+1;
    	   	
    	this.getEnvironmentState().setPosicionPirata(posicionPirata);
    	    	
    	if(!(posicionPirata==getEnvironmentState().getPosicionAgente())){
    		
    		for(int i=0; i<5;i++){
    			
    			int robo =(int)(this.getEnvironmentState().getTesoros()[posicionPirata][i]*Math.random());
    			this.getEnvironmentState().getTesoros()[posicionPirata][i] -= robo;
    			this.getEnvironmentState().getTesoroPirata()[i] += robo;
    			
    			
    		}
    	   		
    	}
    	
    	
    }
    
    public String toString() {
        return environmentState.toString();
    }
    

    @Override
    public boolean agentFailed(Action actionReturned) {

        EstadoActualIsla envState = this.getEnvironmentState();

        // TODO: Hacer: Verificar si en el ambiente se puede o no realizar la accion 

        return false;
    }
    
    public void actualizarDatosAmbiente(int escenario){
    	
    	this.getEnvironmentState().setPosicionEnMapa(this.getDatosAmbiente().getEscenarios().get(escenario-1).getPosicionEnMapa());
    	this.getEnvironmentState().setTesoros(this.getDatosAmbiente().getEscenarios().get(escenario-1).getTesoros());
    	this.getEnvironmentState().setMapa(this.getDatosAmbiente().getEscenarios().get(escenario-1).getMapa());
    	this.getEnvironmentState().setPosicionPirata(this.getDatosAmbiente().getEscenarios().get(escenario-1).getPosicionPirata());
    	
    }

	public DatosAmbiente getDatosAmbiente() {
		return datosAmbiente;
	}

	public void setDatosAmbiente(DatosAmbiente datosAmbiente) {
		this.datosAmbiente = datosAmbiente;
	}


	public void setLog(Log log) {
		this.log = log;
	}


	public Log getLog() {
		return log;
	}


	public void setPirata(boolean pirata) {
		this.pirata = pirata;
	}


	public boolean isPirata() {
		return pirata;
	}


	public void setControlSimulacion(ControlSimulacion controlSimulacion) {
		this.controlSimulacion = controlSimulacion;
	}


	public ControlSimulacion getControlSimulacion() {
		return controlSimulacion;
	}
    

	//TODO: Complete this section with agent-specific methods
    // The following methods are agent-specific:
    
    
}
